package web.protocols.action;

import com.opensymphony.xwork2.ModelDriven;
import common.JSONArray;
import domain.entities.*;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.springframework.beans.factory.annotation.Autowired;
import services.*;
import services.exceptions.NoProtocoloCompromisopaisSelectedException;
import services.user.UserServicesImpl;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: Guillermo
 * Date: 17/08/12
 * Time: 15:58
 * To change this template use File | Settings | File Templates.
 */

@Namespace("/Protocols/Staff")
public class StaffController extends MenuController implements ModelDriven, ServletResponseAware, ServletRequestAware {

    private RoleCRUDService roleService;
    private CompromisoPaisService compromisoPaisService;
    private CenterCRUDService centroService;
    private ProtocolCRUDService protocolCRUDService;
    private UserServicesImpl userServices;
    private MiembroBmsProtocoloService miembroBmsProtocoloService;
    private MiembroBmsProtocolo miembroBmsProtocolo = new MiembroBmsProtocolo();
    private List<Role> roles;
    private List<MiembroBms> users = new ArrayList<MiembroBms>();
    private String userName;
    private List<Compromisopais> compromisopaisList = new ArrayList<Compromisopais>();
    private List<String> compromisopaisListSelect = new ArrayList<String>();
    private List<Centro> centroList = new ArrayList<Centro>();
    private List<Integer> centroListSelect = new ArrayList<Integer>();
    private List<String> countries = new ArrayList<String>();

    private List<StaffBMS> list;

    private String person;
    private Integer miembroBmsId;
    private String protocoloCompromisopaisprotocoloid;
    private Integer protocoloCompromisopaiscompromisopaisid;

    private MiembroBmsProtocoloId miembroBmsProtocoloId;
    private Integer personID;

   public Object getModel() {
        return miembroBmsProtocolo;
    }

    @Autowired
    public StaffController(RoleCRUDService roleService, CompromisoPaisService compromisoPaisService, CenterCRUDService centroService, ProtocolCRUDService protocolCRUDService, UserServicesImpl userServices, ProtocoloCompromisopaisService protocoloCompromisopaisService, MiembroBmsProtocoloService miembroBmsProtocoloService) {
        super(protocoloCompromisopaisService);
        this.roleService = roleService;
        this.compromisoPaisService = compromisoPaisService;
        this.centroService = centroService;
        this.protocolCRUDService = protocolCRUDService;
        this.userServices = userServices;

        this.miembroBmsProtocoloService = miembroBmsProtocoloService;

    }

    @Action(value="main", results={
            @Result(name="success",location="/directories.staff_protocols.tiles", type="tiles")
    })
    public String execute() {

        ProtocoloCompromisopais aux = null;
        try {
            aux = protocolCRUDService.recoverProtocoloCompromisopais();
        } catch (NoProtocoloCompromisopaisSelectedException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        if(aux == null)
            return null;
        String protocoloId = aux.getProtocolo().getId();
        roles = roleService.findStaffRole();
        compromisopaisList = new ArrayList<Compromisopais>();

        for(ProtocoloCompromisopais c : aux.getProtocolo().getProtocoloCompromisopaises()){
            compromisopaisList.add(c.getCompromisopais());

        }

        list = new ArrayList<StaffBMS>();
        List<MiembroBmsProtocolo> list2 = miembroBmsProtocoloService.findByProtocoloId(protocoloId, aux.getCompromisopais().getId());

        for (Iterator<MiembroBmsProtocolo> iterator = list2.iterator(); iterator.hasNext();) {
            List<Centro> sities = new ArrayList<Centro>();
            MiembroBmsProtocolo miembroBmsProtocolo = (MiembroBmsProtocolo) iterator.next();
            StaffBMS staffBMS = new StaffBMS();
            staffBMS.setMiembroBmsProtocolo(miembroBmsProtocolo);
            staffBMS.setCompromisopaises(compromisoPaisService.findByProtocoloMiembroBMsId(protocoloId, miembroBmsProtocolo.getMiembroBms().getId()));

            for (Centro c : miembroBmsProtocolo.getSites()){
                sities.add(c);
            }
            staffBMS.setSites(sities);
            boolean insert = true;
            if(list.size() > 0){
                for(StaffBMS s: list){
                    if( s.getMiembroBmsProtocolo().getMiembroBms().getId().equals(staffBMS.getMiembroBmsProtocolo().getMiembroBms().getId())){
                         insert = false;
                        for (Centro c2 : miembroBmsProtocolo.getSites()){
                            s.getSites().add(c2);
                        }
                    }
                }
                if(insert)
                    list.add(staffBMS);
            }else
                list.add(staffBMS);
        }
        compromisopaisListSelect = new ArrayList<String>();
        compromisopaisListSelect.add(aux.getCompromisopais().getCountry());


        if(miembroBmsId != null && protocoloCompromisopaiscompromisopaisid != null && protocoloCompromisopaisprotocoloid != null){
            MiembroBmsProtocoloId miembroBmsProtocoloId = new MiembroBmsProtocoloId();
            miembroBmsProtocoloId.setMiembroBmsid(miembroBmsId);
            miembroBmsProtocoloId.setProtocoloCompromisopaiscompromisopaisid(protocoloCompromisopaiscompromisopaisid);
            miembroBmsProtocoloId.setProtocoloCompromisopaisprotocoloid(protocoloCompromisopaisprotocoloid);
            miembroBmsProtocolo = miembroBmsProtocoloService.findById(miembroBmsProtocoloId);

           personID = miembroBmsProtocolo.getMiembroBms().getId();
           person = miembroBmsProtocolo.getMiembroBms().getSurname() + ", " + miembroBmsProtocolo.getMiembroBms().getName();
           for(MiembroBmsProtocolo miembroBmsP :miembroBmsProtocolo.getMiembroBms().getMiembroBmsProtocolos()){
               compromisopaisListSelect.add( miembroBmsP.getProtocoloCompromisopais().getCompromisopais().getCountry() );
            }

            for(MiembroBmsProtocolo miembroBmsP :miembroBmsProtocolo.getMiembroBms().getMiembroBmsProtocolos()){
                compromisopaisListSelect.add( miembroBmsP.getProtocoloCompromisopais().getCompromisopais().getCountry() );
                for(Centro c : miembroBmsP.getSites()){
                    centroListSelect.add(c.getId());
                }
            }

        }  else
        {
            miembroBmsProtocolo = new MiembroBmsProtocolo();
            person = "";
            personID = null;
            compromisopaisListSelect.clear();
            compromisopaisListSelect.add(aux.getCompromisopais().getCountry());
        }
        centroList = centroService.getAllByCountries(compromisopaisListSelect);
        Centro centro = new Centro(-1,"ALL");
        centroList.add(0,centro);
        return SUCCESS;
    }

    @Action(value="getSites", results={
            @Result(name="success",location="/directories.staff_protocols.tiles", type="tiles")
    })
    public void getSites() {

        try {
            if(countries.size() > 0 && countries.get(0) != null)
                centroList = centroService.getAllByCountries(countries);
            else
                centroList = centroService.list();

            String respuesta = JSONArray.formatJSONToSelect(centroList,"id","institucion");

            response.setContentType("text/json");
            response.getWriter().write(respuesta);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Action(value="save", results={
            @Result(name="success",location="main", type="redirectAction")
    })
    public String save() {

        String protocoloId = null;
        try {
            protocoloId = protocolCRUDService.recoverProtocoloCompromisopais().getProtocolo().getId();
        } catch (NoProtocoloCompromisopaisSelectedException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

        String[] nombre = person.split(",");

        MiembroBms miembro = userServices.findById(personID);
        miembro.setProjectLead(miembroBmsProtocolo.getMiembroBms().getProjectLead());
        miembro.setUnboundedMonitor(miembroBmsProtocolo.getMiembroBms().getUnboundedMonitor());
        miembro.setRole(roleService.getRoleById(miembroBmsProtocolo.getMiembroBms().getRole().getId()));

        userServices.save(miembro);

        List<MiembroBmsProtocolo> listDelete = miembroBmsProtocoloService.findByMiembroBmsId(miembro.getId());
        for(MiembroBmsProtocolo m : listDelete ){
            miembroBmsProtocoloService.delete(m);
        }

        for(int i=0; i<compromisopaisListSelect.size();i++){

            MiembroBmsProtocolo miembroBmsP = new MiembroBmsProtocolo();
            Compromisopais cp =   compromisoPaisService.findByCountry(compromisopaisListSelect.get(i));
            ProtocoloCompromisopais protocoloCompromisopais = protocoloCompromisopaisService.getByProtocoloIdCompromisopaisId(protocoloId, cp.getId() );
            miembroBmsP.setProtocoloCompromisopais(protocoloCompromisopais);
            miembroBmsP.setMiembroBms(miembro);
            MiembroBmsProtocoloId miembroBmsProtocoloId = new MiembroBmsProtocoloId();
            miembroBmsProtocoloId.setMiembroBmsid(miembro.getId());
            miembroBmsProtocoloId.setProtocoloCompromisopaiscompromisopaisid(protocoloCompromisopais.getCompromisopais().getId());
            miembroBmsProtocoloId.setProtocoloCompromisopaisprotocoloid(protocoloCompromisopais.getProtocolo().getId());
            miembroBmsP.setId(miembroBmsProtocoloId);
            miembroBmsP.setSince(miembroBmsProtocolo.getSince());
            miembroBmsP.setUntil(miembroBmsProtocolo.getUntil());
            miembroBmsP.setActivo(miembroBmsProtocolo.getActivo());
            List<String> countries = new ArrayList<String>();
            if( centroListSelect.size() > 0 ){
                List<Centro> centros = new ArrayList<Centro>();
                if( centroListSelect.get(0) == -1 )
                {
                    centroList = centroService.getAllByCountries(compromisopaisListSelect);
                    for(int k=0; k<centroList.size();k++){
                        Centro centro = centroList.get(k);
                        countries.clear();
                        for(CentroAddress ca : centro.getCentroAddresses()){

                            if( ca.getAddress().getCountry().toUpperCase().trim().equals(protocoloCompromisopais.getCompromisopais().getCountry().toUpperCase().trim()) ){
                                if( countries.size() > 0)  {
                                    for(String c : countries){
                                        if(!c.toUpperCase().trim().equals(ca.getAddress().getCountry().toUpperCase().trim())) {
                                            centros.add(centro);
                                            countries.add(ca.getAddress().getCountry());
                                        }
                                    }
                                }else{
                                    centros.add(centro);
                                    countries.add(ca.getAddress().getCountry());
                                }
                            }

                        }

                    }

                }else{
                    for(int j=0; j<centroListSelect.size();j++){
                        Centro centro = centroService.findById(centroListSelect.get(j));
                        countries.clear();
                        for(CentroAddress ca : centro.getCentroAddresses()){

                            if( ca.getAddress().getCountry().toUpperCase().trim().equals(protocoloCompromisopais.getCompromisopais().getCountry().toUpperCase().trim()) ){
                              if( countries.size() > 0)  {
                                  for(String c : countries){
                                      if(!c.toUpperCase().trim().equals(ca.getAddress().getCountry().toUpperCase().trim())) {
                                          centros.add(centro);
                                          countries.add(ca.getAddress().getCountry());
                                      }
                                  }
                              }else{
                              centros.add(centro);
                              countries.add(ca.getAddress().getCountry());
                              }
                          }

                        }


                    }
                }
                miembroBmsP.setSites(centros);
            }




            miembroBmsProtocoloService.save(miembroBmsP);
        }





        return SUCCESS;
    }






    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    public List<MiembroBms> getUsers() {
        return users;
    }

    public void setUsers(List<MiembroBms> users) {
        this.users = users;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }


    public List<Compromisopais> getCompromisopaisList() {
        return compromisopaisList;
    }

    public void setCompromisopaisList(List<Compromisopais> compromisopaisList) {
        this.compromisopaisList = compromisopaisList;
    }

    public List<String> getCompromisopaisListSelect() {
        return compromisopaisListSelect;
    }

    public void setCompromisopaisListSelect(List<String> compromisopaisListSelect) {
        this.compromisopaisListSelect = compromisopaisListSelect;
    }

    public List<Integer> getCentroListSelect() {
        return centroListSelect;
    }

    public void setCentroListSelect(List<Integer> centroListSelect) {
        this.centroListSelect = centroListSelect;
    }

    public List<Centro> getCentroList() {
        return centroList;
    }

    public void setCentroList(List<Centro> centroList) {
        this.centroList = centroList;
    }

    public String getPerson() {
        return person;
    }

    public void setPerson(String person) {
        this.person = person;
    }

    public List<StaffBMS> getList() {
        return list;
    }

    public void setList(List<StaffBMS> list) {
        this.list = list;
    }

    public Integer getMiembroBmsId() {
        return miembroBmsId;
    }

    public void setMiembroBmsId(Integer miembroBmsId) {
        this.miembroBmsId = miembroBmsId;
    }

    public String getProtocoloCompromisopaisprotocoloid() {
        return protocoloCompromisopaisprotocoloid;
    }

    public void setProtocoloCompromisopaisprotocoloid(String protocoloCompromisopaisprotocoloid) {
        this.protocoloCompromisopaisprotocoloid = protocoloCompromisopaisprotocoloid;
    }

    public Integer getProtocoloCompromisopaiscompromisopaisid() {
        return protocoloCompromisopaiscompromisopaisid;
    }

    public void setProtocoloCompromisopaiscompromisopaisid(Integer protocoloCompromisopaiscompromisopaisid) {
        this.protocoloCompromisopaiscompromisopaisid = protocoloCompromisopaiscompromisopaisid;
    }

    public Integer getPersonID() {
        return personID;
    }

    public void setPersonID(Integer personID) {
        this.personID = personID;
    }

    public List<String> getCountries() {
        return countries;
    }

    public void setCountries(List<String> countries) {
        this.countries = countries;
    }

    public MiembroBmsProtocolo getMiembroBmsProtocolo() {
        return miembroBmsProtocolo;
    }

    public void setMiembroBmsProtocolo(MiembroBmsProtocolo miembroBmsProtocolo) {
        this.miembroBmsProtocolo = miembroBmsProtocolo;
    }

    public MiembroBmsProtocoloId getMiembroBmsProtocoloId() {
        return miembroBmsProtocoloId;
    }

    public void setMiembroBmsProtocoloId(MiembroBmsProtocoloId miembroBmsProtocoloId) {
        this.miembroBmsProtocoloId = miembroBmsProtocoloId;
    }

    private HttpServletRequest request;
    private HttpServletResponse response;

    @Override
    public void setServletRequest(javax.servlet.http.HttpServletRequest request) {
        this.request   = request;
    }

    @Override
    public void setServletResponse(javax.servlet.http.HttpServletResponse response) {
       this.response = response;
    }


    private boolean hdargentina;
    private boolean hdcolombia;
    private boolean hdbrasil;
    private boolean hdperu;
    private String display;

    public boolean isHdargentina() {
        return hdargentina;
    }

    public void setHdargentina(boolean hdargentina) {
        this.hdargentina = hdargentina;
    }

    public boolean isHdcolombia() {
        return hdcolombia;
    }

    public void setHdcolombia(boolean hdcolombia) {
        this.hdcolombia = hdcolombia;
    }

    public boolean isHdbrasil() {
        return hdbrasil;
    }

    public void setHdbrasil(boolean hdbrasil) {
        this.hdbrasil = hdbrasil;
    }

    public boolean isHdperu() {
        return hdperu;
    }

    public void setHdperu(boolean hdperu) {
        this.hdperu = hdperu;
    }

    public String getDisplay() {
        return display;
    }

    public void setDisplay(String display) {
        this.display = display;
    }
}